import { Alert, Tabs, TabItem } from '@aws-amplify/ui-react';
import { AppDirectoryAlert } from '@/components/AppDirectoryAlert';
import { Example } from '@/components/Example';
import { Fragment } from '@/components/Fragment';
Amplify UI Geo is powered by
[Geo APIs](https://docs.amplify.aws/lib/geo/getting-started/q/platform/js/) and
[Amazon Location Service](https://aws.amazon.com/location/).
### Quick Start
{({ platform }) => import('@/components/AppDirectoryAlert')}
There's a known issue for users of Create React App v4 where the default prod `browserslist` configuration causes build errors when building for production. See the [Create React App Troubleshooting Guide](/getting-started/troubleshooting#create-react-app) to configure Create React App for use with the MapView UI component.
> Prerequisites:
>
> 1. Install`@aws-amplify/ui-react-geo`with [npm](https://www.npmjs.com/) or [yarn](https://yarnpkg.com/). ( e.g. `npm install @aws-amplify/ui-react-geo`)
> 2. Create map resources by following the [Amplify Geo documentation](https://docs.amplify.aws/lib/geo/getting-started/q/platform/js/).
## MapView
The `MapView` component adds an interactive map to your application.
`MapView` is fully integrated with the open source library [react-map-gl](https://visgl.github.io/react-map-gl/) v7
while using [maplibre-gl-js](https://maplibre.org/maplibre-gl-js/docs/API/) as the map tile source. `MapView` is
used as a replacement to `react-map-gl`'s [default map](https://visgl.github.io/react-map-gl/docs/api-reference/map)
and supports the same functionality.
You can import the `MapView` component with related styles and use it in your Amplify application without any
additional configuration.
{({ platform }) => import(`./fragments/map-quick-start.${platform}.mdx`)}
If the map isn't taking up the entire screen, try resetting your browser's default CSS body margins:
{({ platform }) => import(`./fragments/margin-reset.${platform}.mdx`)}
### Setting Initial Viewport
The map's initial viewport can be set with the `initialViewState` property:
{({ platform }) => import(`./fragments/map-initial-viewport.${platform}.mdx`)}
### Usage with react-map-gl
#### Moving Marker
The `Marker` component from the `react-map-gl` library can have dynamic `latitude` and `longitude` properties to create
a moving marker. The marker's position will reflect changes in `latitude` and `longitude`.
{({ platform }) => import(`./fragments/marker-moving.${platform}.mdx`)}
#### Marker with Popup
The `Popup` component from the `react-map-gl` library can be used with a `Marker` to communicate information to a user
when the marker is clicked. The `offset` property can be used to prevent the popup from overlapping the marker.
{({ platform }) => import(`./fragments/marker-with-popup.${platform}.mdx`)}
_Note: Ensure `originalEvent.stopPropagation()` is called in the marker click handler. This allows the `showPopup`
state to be handled by the component._
### Animation and Native Map Methods
You may want to access the [native maplibre-gl map object](https://maplibre.org/maplibre-gl-js/docs/API/classes/maplibregl.Map/) from within the component that renders `` (to animate a viewport transition with `flyTo`, for example). To accomplish this, you can pass your own ref to `` using [React's `useRef` hook](https://legacy.reactjs.org/docs/hooks-reference.html#useref) which will contain the `map` object:
{({ platform }) => import(`./fragments/map-ref.${platform}.mdx`)}
If you want access to the `map` object in a child component of ``, you can use the [useMap hook from react-map-gl](https://visgl.github.io/react-map-gl/docs/api-reference/use-map) instead:
{({ platform }) => import(`./fragments/use-map.${platform}.mdx`)}
## Location Search
`LocationSearch` provides location search powered by [Amazon Location Service](https://aws.amazon.com/location/) for the
`MapView` component, using the viewport as the proximity for generating results. `LocationSearch` is used as a child
component of `MapView` for which it renders visual markers and information based on its location search results.
You can import the `LocationSearch` component with related styles and use it as a child of `MapView` without any
additional configuration.
{({ platform }) =>
import(`./fragments/location-search-quick-start.${platform}.mdx`)
}
### LocationSearch Position
`LocationSearch` can be provided a `position` property when used with `MapView`. The property is not reactive, meaning the
position is fixed after the component mounts. Valid values are `'top-right'`, `'top-left'`, `'bottom-right'`, and
`'bottom-left'`. Default value is `'top-right'`.
{({ platform }) =>
import(`./fragments/location-search-position.${platform}.mdx`)
}
### Standalone LocationSearch
`LocationSearch` can also be used as a standalone component without `MapView`. As a standalone component, `LocationSearch`
provides search results based on an initial proximity. When used as a standlone component, the `proximity` property
with provided `latitude` and `longitude` properties is required.
{({ platform }) =>
import(`./fragments/location-search-standalone.${platform}.mdx`)
}